package business.coding.matching

import business.ViewLogger;
import business.coding.CandidateCenter

import domain.Center
import java.util.HashMap;
import java.util.List;
import org.apache.log4j.Logger
import business.database.sqliteMaescorp.AbsSqliteDAOFactory;
import business.parser.CorpWrapper
import business.coding.Context;

/**
 * Clase para la busqueda de candidatos a partir del matching exacto de todas las palabras del contexto
 * @author 53385255R
 *
 */
public class MatchingSearch_ByExactlyWords extends MatchingSearch {

	
	public MatchingSearch_ByExactlyWords(Integer modelId,CorpWrapper corp) {
		super(modelId,corp);
	}
	
	/**
	 * El matching exacto obliga al corp del maescorp a contener las mismas palabras exactamente que el corp buscado.
	 * No tienen que ser 100% iguales, puesto que no se tienen en cuenta el orden ni las palabras excluidas.
	 * Se exige coincidencia con prov, pero no que los segmentos de provincia y pais concuerden.
	 * @param prov provincia que debe tener el centro encontrado
	 * @return listado de centros
	 */
   public List<CandidateCenter> searchCandidateCenters(List<String> provs, String like) {
	    reset();
		
		List<CandidateCenter> centersW = new ArrayList<CandidateCenter>();
		
		//Buscamos los corps que hagan matching exacto
		
		List<Integer> corps = AbsSqliteDAOFactory.getInstance().getContextcorpftsDAO(_modelId).selectIdCorpsByAllWords(_corp._contextWords)
		
		if (corps.size() > 0) {
			
			corps.each { idcorp ->
				
				Integer maesNumWdsRep = AbsSqliteDAOFactory.getInstance().getCorpDataDAO(_modelId).selectContextWordCountWithRepeated(idcorp);
				Integer maesNumWds = AbsSqliteDAOFactory.getInstance().getCorpDataDAO(_modelId).selectContextWordCount(idcorp);
				//Calculamos el contexto para cada numero de palabras coincidentes
				
				double ctxt = Context.calculateWordBasedContext(_corp._contextWords.size(),_corp._contextCountWithRepeated,maesNumWdsRep,100) * 100;
				if (ctxt == 100) {
					
					//Si no hay palabras repetidas en ningun corp, le doy 150 para diferenciarlo de los que no son exactos pero tienen el 100%
					if ((maesNumWdsRep == maesNumWds) && (_corp._contextCountWithRepeated == _corp._contextCount))
						ctxt = 150;
					
					List<Center> cens = null;
					
					for (String prov : provs) {
						cens = AbsSqliteDAOFactory.getInstance().getCenterDAO(_modelId).selectCenterByProv(idcorp,prov);
							 cens.each { cen ->
								 addFndCenter(ctxt,idcorp, "Contexto: EXACTO PALABRAS", fndCenters, cen);
							 };
					}
					
					//Si no se encuentra nada en las provincias, buscamos centros del idcorp fuera de ellas
					if ((cens == null) || (cens.size() == 0)) {
						cens = AbsSqliteDAOFactory.getInstance().getCenterDAO(_modelId).selectCenter(idcorp);
							cens.each { cen ->
								addFndCenter(ctxt,idcorp, null, tempNoProvsCenters, cen);
							};
					}
				}
			}
			
		}
		
		return fndCenters;
   }
}
